package 线程同步;
/*
* 安全问题出现的条件
* 1.是多线程环境
* 2.有共享数据
* 3.有多条语句操作共享数据
* 如何解决多线程安全问题
* 1.让程序没有安全问题的环境
* 如何实现嘞？
* 把多条语句操作共享数据的代码锁起来，让任意时刻只能有一个线程执行就可
* java提供了同步代码块的方式来解决
* */
public class 同步代码块解决数据安全问题 {
    public static void main(String[] args) {
        SellTicket2 st = new SellTicket2();
        Thread t1 = new Thread(st, "窗口1");
        Thread t2 = new Thread(st, "窗口2");
        Thread t3 = new Thread(st, "窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}
class SellTicket2 implements Runnable{
    private int tickets=100;
    private Object obj=new Object();
    @Override
    public void run() {
        while (true){
            /*假设t1抢到了cpu的执行权*/
            /*假设t2抢到了cpu的执行权*/
            synchronized (obj){
                /*t1进来之后，就会把这段代码锁起来*/
                if(tickets>0){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    /*窗口1正在出售第100张票*/
                    System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
                    tickets--;
                }
            }
            /*t1出来了，这段代码的锁就被释放了*/
        }
    }
}